package com.bitoon.basketdudes.web;

import com.bitoon.basketdudes.web.commons.RankingCommon;
import com.bitoon.basketdudes.web.datos.DatosRanking;
import com.bitoon.basketdudes.web.datos.JugadorQuintetoSemana;
import com.bitoon.basketdudes.web.datos.ManagerSemana;
import com.bitoon.basketdudes.web.datos.MejorEquipo;
import com.bitoon.basketdudes.web.datos.MensajeUsuario;
import com.bitoon.basketdudes.web.jpa.*;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.interceptor.I18nInterceptor;
import com.opensymphony.xwork2.util.ValueStack;

import java.util.*;
import javax.persistence.*;
import org.apache.log4j.Logger;
import org.apache.struts2.ServletActionContext;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.output.XMLOutputter;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;


public class BaseActionCopiaAdmin extends ActionSupport {

    //private static String privatePath = "/home/webdev";
    private static String hostMedia = "";

    private String paginaRetorno;
    private String urlRedirect;
    private UtilidadesBean utilidadesBean;

    private int numMensajesBandejaEntrada = 0;

    private List<Equipo> listaEquiposMostrar;

    private Logger log = Logger.getLogger(BaseAction.class);

    protected Map session;

    public static final String NOT_FOUND = "not_found";
    public static final String REDIRECT = "redirect";
    public static final String LOGADO = "logado";
    public static final String NO_LOGADO = "no_logado";
    public static final String LANDING = "landing";

    public static final int ID_JUEGO_BASKETDUDES = 1;

    /* <Datos para la paginacion> */
    protected static final int LISTADO_EQUIPOS_ELEMENTOS_POR_PAGINA = 10;
    protected static int LISTADO_EQUIPOS_HUECOS_LADO_PAGINA = 2;  // Número de "huecos" a los lados de la página central ==> [1 2] 3 [4 5]
    
    protected static int LISTADO_NETWORKS_ELEMENTOS_POR_PAGINA = 10;
    protected static int LISTADO_NETWORKS_HUECOS_LADO_PAGINA = 2; // Número de "huecos" a los lados de la página central ==> [1 2] 3 [4 5]

    protected int LISTADO_RANKING_POSICIONES_FILA = 10;
    protected int LISTADO_RANKING_HUECOS_LADO_PAGINA = 2;

    protected static final int LISTADO_TORNEOS_ELEMENTOS_POR_PAGINA = 10;
    protected static int LISTADO_TORNEOS_HUECOS_LADO_PAGINA = 2;  // Número de "huecos" a los lados de la página central ==> [1 2] 3 [4 5]

    protected static final int LISTADO_INSCRITOS_ELEMENTOS_POR_PAGINA = 10;
    protected static int LISTADO_INSCRITOS_HUECOS_LADO_PAGINA = 2;  // Número de "huecos" a los lados de la página central ==> [1 2] 3 [4 5]

    protected static final int LISTADO_MANAGERS_ELEMENTOS_POR_PAGINA = 10;
    protected static int LISTADO_MANAGERS_HUECOS_LADO_PAGINA = 2;  // Número de "huecos" a los lados de la página central ==> [1 2] 3 [4 5]

    protected static final int LISTADO_RESULTADOS_ELEMENTOS_POR_PAGINA = 20;
    protected static int LISTADO_RESULTADOS_HUECOS_LADO_PAGINA = 2;  // Número de "huecos" a los lados de la página central ==> [1 2] 3 [4 5]

    protected static final int LISTADO_NOTICIAS_ELEMENTOS_POR_PAGINA = 10;
    protected static int LISTADO_NOTICIAS_HUECOS_LADO_PAGINA = 2;  // Número de "huecos" a los lados de la página central ==> [1 2] 3 [4 5]


    /* </Datos para la paginacion> */

    private static String pathMensajeriaUsuario = "/proyectos/web/www.basketdudes.com/mensajeria";
    private static String pathMensajeriaTorneo = "/proyectos/web/www.basketdudes.com/mensajeria/temporada";

    private List<MensajeUsuario> listaMensajes;
    protected static final int VERSION_ACTUAL_MENSAJES = 2;
    public static final int TIPO_TIPODESTINATARIO_USUARIO = 0;
    public static final int TIPO_TIPODESTINATARIO_TORNEO = 1;

    private String[] mensaje; // Para recibir los ids del borrado de mensaje y el texto de contactar
    private String asunto;

    protected EntityManagerFactory emfBasket = null;

    protected String idioma;

    public static String catalogos[] = {"jpa_basket"};
    
    public BaseActionCopiaAdmin() {

        //.debug("en constructor de BaseAction ... ");
        session = ActionContext.getContext().getSession();

        try {
            // JPA Units
            emfBasket = PersistenceManager.getInstance().getEntityManagerFactory(catalogos[0]);
        } catch (Exception e) {
            log.error("[ERROR][constructor]: No se pudo conectar a la base de datos: " + e);
        }

        // Lee los mensajes del usuario
        if (getUsuarioLogado()!=null) {
            setListaEquiposMostrar(getUsuarioLogado().getEquipos());
            if ( session.get("mensajesLeidos") == null || session.get("mensajesLeidos") == "") {
                log.debug("leerMensajesUsuario !!!");
                setListaMensajes(leerMensajesUsuario(getUsuarioLogado().getId()));                
                session.put("mensajesLeidos", getListaMensajes());
            } else {
                try {
                    setListaMensajes((List<MensajeUsuario>)session.get("mensajesLeidos"));
                } catch (Exception e) {
                    setListaMensajes(null);
                }
            }
            if (getListaMensajes()!=null) {
                setNumMensajesBandejaEntrada(getListaMensajes().size());
            } else {
                setNumMensajesBandejaEntrada(0);
            }
        }

        idioma = (String)session.get("bd_lang");

        if (idioma==null) {
            String idiomaContexto = ActionContext.getContext().getLocale().getLanguage();

            //log.debug("idiomaContexto: "+idiomaContexto);
            // Idioma por defecto
            idioma = "en";
            
            if (idiomaContexto.equalsIgnoreCase("es")) {
                idioma = "es";
            }
        }
        
        setUtilidadesBean(new UtilidadesBean());

        // Leer propiedades generales
    }

    @Override
    public String execute() {
        return SUCCESS;
    }

    // Por si hay que mostrar los rankings

    public DatosRanking getRankingGlobal(int idEquipo) {
        RankingCommon rc = new RankingCommon();
        return rc.consultaRankingGlobal(idEquipo);
    }

    public DatosRanking getRankingPais(String pais, int idEquipo) {
        RankingCommon rc = new RankingCommon();
        return rc.consultaRankingPais(idEquipo, pais);
    }

    public String getPaginaRetorno() {
        return paginaRetorno;
    }

    public String getIdioma() {
        return idioma;
    }

    public void setPaginaRetorno(String paginaRetorno) {
        this.paginaRetorno = paginaRetorno;
    }

    public String getUrlR() {
        return urlRedirect;
    }

    public String getUrlREncoded() {
        String encodedURL = "";
        try {
            encodedURL = java.net.URLEncoder.encode(urlRedirect, "utf8");
        } catch (Exception e) {
            log.error("Error, ", e);
        }
        return encodedURL;
    }

    public void setUrlR(String urlR) {
        
        if (!urlR.equals("/")) {
            log.debug("llamando setUrlR: [" + urlR + "]");
            if (!urlR.equals("/home")) {
                this.urlRedirect = urlR;
                paginaRetorno = urlRedirect;

                String ant = (String)session.get("paginaRetorno");
                /*
                if (ant!=null) {
                    session.put("paginaRetornoAnt", ant);
                } else {
                    session.put("paginaRetornoAnt", urlR);
                }
                 *
                 */
                if (paginaRetorno.equals("/landing/")) {
                    paginaRetorno = "/";
                }
                session.put("paginaRetorno", paginaRetorno);
                log.debug("fijada paginaRetorno: " + paginaRetorno);
            }
        }

    }

    public String getMensajeAlerta() {
        String retorno = null;
        if (session.get("mensajeAlerta") != null) {
            retorno = (String)session.get("mensajeAlerta");
            session.remove("mensajeAlerta");
        }
        return retorno;
    }

    public void setMensajeAlerta(String mensaje) {
        session.put("mensajeAlerta", mensaje);
    }

    public int getHayMensajeAlerta() {
        int retorno = 0;
        if (session.get("mensajeAlerta") != null) {
            retorno = 1;
        }
        return retorno;
    }

    public int getIdUsuarioLogado() {
        int retorno = -1;

        try {
            if (session.get("bd_userId")!=null) {
                retorno = Integer.parseInt((String)session.get("bd_userId"));
            }
        } catch (Exception e) {
            // No hay usuario logado
            log.error("No se pudo consultar el usuario logado", e);
        }

        return retorno;
    }

    public final Usuario getUsuarioLogado() {
        Usuario retorno = null;

        try {
            if (session != null && session.get("bd_userLogado")!=null) {
                retorno = (Usuario)session.get("bd_userLogado");
            }
        } catch (Exception e) {
            log.error("No se pudo consultar el usuario logado", e);
        }

        return retorno;
    }

    /*
     * Deja en la sesion el usuario actualizado, con sus nuevos bitoones o sus
     * nuevos mensajes
     */
    public String actualizarUsuario() {
        String retorno = SUCCESS;
        EntityManager em = null;

        try {
            if (session != null && session.get("bd_userLogado")!=null) {
                Usuario u = (Usuario)session.get("bd_userLogado");

                em = emfBasket.createEntityManager(); // checked

                Usuario nuevoUsuario = em.find(Usuario.class, u.getId());

                session.put("bd_userId", Integer.toString(nuevoUsuario.getId()));
                session.put("bd_userLogado", nuevoUsuario);

                ValueStack valueStack = ActionContext.getContext().getValueStack();
                valueStack.set("stackUserLogado", nuevoUsuario);
            }
        } catch (Exception e) {
            log.error("No se pudo actualizar el usuario: ", e);
        } finally {
            try { em.close(); } catch (Exception e) { };
        }

        return retorno;
    }


    public String getNombreUrl(String nombre) {
        String retorno = "";
        
        try {
            retorno = nombre.toLowerCase();
            retorno = retorno.replace(" ", "-");
        } catch (Exception e) {
            log.error("Error en dameNombreUrl", e);
        }

        return retorno;
    }

    public static String getHostMedia() {
        return hostMedia;
    }

    public static void setHostMedia(String aHostMedia) {
        hostMedia = aHostMedia;
    }


    protected ManagerSemana leerManagerXML() {

        ManagerSemana m = null;

        try {
            SAXBuilder parser = new SAXBuilder();
            File f = new File(ServletActionContext.getServletContext().getRealPath("/bd/xml/manager_semana.xml"));
            Document doc = parser.build(f);

            m = new ManagerSemana();

            Element root = doc.getRootElement();
            m.setId(Integer.parseInt(root.getChild("id").getText()));
            m.setNick(root.getChild("nick").getText());
            m.setNickUrl(root.getChild("nickUrl").getText());
            m.setPartidosGanados(Integer.parseInt(root.getChild("partidosGanados").getText()));
            m.setNiveles(Integer.parseInt(root.getChild("niveles").getText()));

        } catch (Exception e) {
            log.error("[ERROR][leerManagerXML]: " , e);
        }

        return m;

    }


    protected ManagerSemana leerManagerAcumuladoXML() {

        ManagerSemana m = null;

        try {
            SAXBuilder parser = new SAXBuilder();
            File f = new File(ServletActionContext.getServletContext().getRealPath("/bd/xml/manager_acumulado.xml"));
            Document doc = parser.build(f);

            m = new ManagerSemana();

            Element root = doc.getRootElement();
            m.setId(Integer.parseInt(root.getChild("id").getText()));
            m.setNick(root.getChild("nick").getText());
            m.setNickUrl(root.getChild("nickUrl").getText());
            m.setPartidosGanados(Integer.parseInt(root.getChild("partidosGanados").getText()));
            m.setNiveles(Integer.parseInt(root.getChild("niveles").getText()));

        } catch (Exception e) {
            log.error("[ERROR][leerManagerXML]: " + e);
        }

        return m;

    }


    protected List<JugadorQuintetoSemana> leerQuintetoXML() {

        List<JugadorQuintetoSemana> retorno = null;

        try {
            retorno = new ArrayList<JugadorQuintetoSemana>();
            JugadorQuintetoSemana j;

            SAXBuilder parser = new SAXBuilder();
            File f = new File(ServletActionContext.getServletContext().getRealPath("/bd/xml/quinteto_semana.xml"));
            Document doc = parser.build(f);
            Element root = doc.getRootElement();
            Iterator iterator = root.getChildren().iterator();
            while (iterator.hasNext()) {
                Element child = (Element) iterator.next();
                j = new JugadorQuintetoSemana();
                j.setNum(Integer.parseInt(child.getChild("num").getText()));
                j.setId(Integer.parseInt(child.getChild("id").getText()));
                j.setNick(child.getChild("nick").getText());
                j.setNickUrl(child.getChild("nickUrl").getText());
                j.setPosicionabbr(child.getChild("posicionabbr").getText());
                j.setPosicion(child.getChild("posicion").getText());
                j.setEquipo(child.getChild("equipo").getText());
                j.setEquipoUrl(child.getChild("equipoUrl").getText());
                j.setLogoimgId(Integer.parseInt(child.getChild("logoimgId").getText()));
                j.setPuntos(Float.parseFloat(child.getChild("puntos").getText()));
                j.setRebotes(Float.parseFloat(child.getChild("rebotes").getText()));
                j.setAsistencias(Float.parseFloat(child.getChild("asistencias").getText()));
                j.setValoracion(Float.parseFloat(child.getChild("valoracion").getText()));
                j.setMvp(Integer.parseInt(child.getChild("mvp").getText()));
                retorno.add(j);
            }
        } catch (Exception e) {
            log.error("[ERROR][leerQuintetoXML]: " , e);
        }

        return retorno;
    }

    protected List<JugadorQuintetoSemana> leerQuintetoAcumuladoXML() {

        List<JugadorQuintetoSemana> retorno = null;

        try {
            retorno = new ArrayList<JugadorQuintetoSemana>();
            JugadorQuintetoSemana j;

            SAXBuilder parser = new SAXBuilder();
            File f = new File(ServletActionContext.getServletContext().getRealPath("/bd/xml/quinteto_acumulado.xml"));
            Document doc = parser.build(f);
            Element root = doc.getRootElement();
            Iterator iterator = root.getChildren().iterator();
            while (iterator.hasNext()) {
                Element child = (Element) iterator.next();
                j = new JugadorQuintetoSemana();
                j.setNum(Integer.parseInt(child.getChild("num").getText()));
                j.setId(Integer.parseInt(child.getChild("id").getText()));
                j.setNick(child.getChild("nick").getText());
                j.setNickUrl(child.getChild("nickUrl").getText());
                j.setPosicionabbr(child.getChild("posicionabbr").getText());
                j.setPosicion(child.getChild("posicion").getText());
                j.setEquipo(child.getChild("equipo").getText());
                j.setEquipoUrl(child.getChild("equipoUrl").getText());
                j.setLogoimgId(Integer.parseInt(child.getChild("logoimgId").getText()));
                j.setPuntos(Float.parseFloat(child.getChild("puntos").getText()));
                j.setRebotes(Float.parseFloat(child.getChild("rebotes").getText()));
                j.setAsistencias(Float.parseFloat(child.getChild("asistencias").getText()));
                j.setValoracion(Float.parseFloat(child.getChild("valoracion").getText()));
                j.setMvp(Integer.parseInt(child.getChild("mvp").getText()));
                retorno.add(j);
            }
        } catch (Exception e) {
            log.error("[ERROR][leerQuintetoXML]: " , e);
        }

        return retorno;
    }

    /*
     * El primero es el mejor ataque y el segundo la mejor defensa
     */
    protected List<MejorEquipo> leerMejoresEquiposXML() {
        List<MejorEquipo> retorno = null;

        try {
            retorno = new ArrayList<MejorEquipo>();
            MejorEquipo e;

            SAXBuilder parser = new SAXBuilder();
            File f = new File(ServletActionContext.getServletContext().getRealPath("/bd/xml/mejores_equipos.xml"));
            Document doc = parser.build(f);
            Element root = doc.getRootElement();
            Iterator iterator = root.getChildren().iterator();

            Element child = root.getChild("ataque");
            
            e = new MejorEquipo();
            e.setNick(child.getChild("nick").getText());
            e.setNickUrl(child.getChild("nickUrl").getText());
            e.setNombre(child.getChild("nombre").getText());
            e.setNombreUrl(child.getChild("nombreUrl").getText());
            e.setPuntos(Float.parseFloat(child.getChild("puntos").getText()));
            retorno.add(e);

            child = root.getChild("defensa");
            e = new MejorEquipo();
            e.setNick(child.getChild("nick").getText());
            e.setNickUrl(child.getChild("nickUrl").getText());
            e.setNombre(child.getChild("nombre").getText());
            e.setNombreUrl(child.getChild("nombreUrl").getText());
            e.setPuntos(Float.parseFloat(child.getChild("puntos").getText()));
            retorno.add(e);
        } catch (Exception e) {
            log.error("[ERROR][leerMejoresEquiposXML]: " + e);
        }

        return retorno;
    }


    protected String traducirTexto(List<String> hijos) {
        //log.debug("llamando a traducirTexto 1");
        return traducirTexto(idioma,hijos);
    }

    protected String traducirTexto(String idioma, List<String> hijos) {

        ManagerSemana m = null;
        String retorno = "";

        try {
            SAXBuilder parser = new SAXBuilder();
            File f = new File(ServletActionContext.getServletContext().getRealPath("/bd/xml/textos_" + idioma + ".xml"));
            Document doc = parser.build(f);

            m = new ManagerSemana();

            Element root = doc.getRootElement();
            Element eHijo = null;

            for (String hijo : hijos) {
                if (eHijo==null) {
                    eHijo = root.getChild(hijo);
                } else {
                    eHijo = eHijo.getChild(hijo);
                }
            }

            retorno = eHijo.getText();

        } catch (Exception e) {
            log.error("[ERROR][traducirTexto]: " , e);
            retorno = "";
        }

        return retorno;

    }

    public String getPosicionLang(String posicion) {
        List<String> nodos = new ArrayList<String>();
        nodos.add("textos");
        nodos.add("posiciones");
        nodos.add("id_" + posicion);

        //log.debug("llamando a traducirTexto 2");
        return traducirTexto(nodos);
    }

    public String getAbbrPosicionLang(String posicion) {
        List<String> nodos = new ArrayList<String>();
        nodos.add("textos");
        nodos.add("posiciones");
        nodos.add("ab_" + posicion);

        //log.debug("llamando a traducirTexto 3");
        return traducirTexto(nodos);
    }

    public String getDescripcionTalentoLang(String idTalento) {
        List<String> nodos = new ArrayList<String>();
        nodos.add("textos");
        nodos.add("talentos");
        nodos.add("id_"+idTalento);
        nodos.add("descripcion");

        //log.debug("llamando a traducirTexto 4");
        return traducirTexto("es", nodos);
    }

    public String getInicialesEquipo(String nombre, String nick) {
        return (nombre.substring(0,1) + nick.substring(0,2)).toUpperCase();
    }

    public UtilidadesBean getUtilidadesBean() {
        return utilidadesBean;
    }

    public void setUtilidadesBean(UtilidadesBean utilidadesBean) {
        this.utilidadesBean = utilidadesBean;
    }

    // Mensajes

    public int contactar(int idDestinatario, String asunto, String cuerpo) {

        int retorno = 1; // No se ha grabado bien

        try {
            MensajeUsuario mu = new MensajeUsuario();

            Usuario ul = getUsuarioLogado();
            mu.setSender(ul.getId());
            mu.setFrom(ul.getNickMostrar());
            mu.setFromUrl(ul.getNick());
            mu.setReceiver(idDestinatario);
            mu.setAsunto(asunto);
            mu.setTexto(cuerpo);

            mu.setTipoUsuarioEmisor(mu.TIPO_USUARIO_NORMAL);

            retorno = escribirMensaje(mu);

        } catch (Exception e) {
            log.error("[contactar]: " , e);
        }

        return retorno;
    }

    public final List<MensajeUsuario> leerMensajesUsuario(int idUsuario) {

        List<MensajeUsuario> retorno = null;
        try {
            Document doc = obtenerXMLMensajesUsuario(idUsuario);

            if (doc != null) {
                Element root = doc.getRootElement();
                List<Element> l = null;

                //comprobamos la versión de los mensajes, si no tiene el atributo 'v' o es null
                //reconvertimos a la versión actual el mensaje

                /*
                 * No se convertirán todavía los mensajes
                 *
                 * -- Inicio
                 *

                int convertir=0;
                if( root.getChild("version") == null ||
                    Integer.parseInt( root.getChild("version").getAttribute("num").getValue()) != VERSION_ACTUAL_MENSAJES){

                    log.debug("Entro a convertir");
                    convertir =1;
                    l = actualizarVersionMensajes(idUsuario,TIPO_TIPODESTINATARIO_USUARIO,root);
                }

                if(convertir==0){ //si no me ha devuelto la conversion ningun valor es que se leen
                    l = root.getChild("listaMensajes").getChildren();
                }
                 *
                 * -- Fin
                 */

                l = root.getChildren();
                
                log.debug("Elementos devueltos: " + l.size() + "son: "+l.toString());

                //creamos la lista de mensajes definitiva
                retorno = new ArrayList<MensajeUsuario>();
                for (Element el : l) {
                    MensajeUsuario elMensaje = new MensajeUsuario();

                    elMensaje.setId(Integer.parseInt(el.getAttributeValue("id")));
                    elMensaje.setTipoUsuarioEmisor(Integer.parseInt(el.getAttributeValue("te")));
                    elMensaje.setFrom(el.getAttributeValue("f"));
                    elMensaje.setFromUrl(el.getAttributeValue("fu"));
                    elMensaje.setSender(Integer.parseInt(el.getAttributeValue("s")));
                    //elMensaje.setTo(el.getAttributeValue("t"));
                    elMensaje.setFecha(el.getAttributeValue("d"));
                    elMensaje.setAsunto(el.getAttributeValue("a"));
                    elMensaje.setTexto(el.getAttributeValue("b"));
                    elMensaje.setSentido(Integer.parseInt(el.getAttributeValue("w")));

                    retorno.add(0,elMensaje);
                }
            }
        } catch (Exception e) {
            log.error("Error", e);
        }

        return retorno;
    }

    /*
     *
    private List<Element> actualizarVersionMensajes(int idUsuario,int tipoDestinatario,Element root) {
        //decidimos si hay que reconvertir los mensajes de la version 0
        int reconvertir = 0; //para la primera version
        List<Element> lMensajes = null;
        if(root.getChild("version") != null) { //si tiene el atributo es version convertida ya
            reconvertir = VERSION_ACTUAL_MENSAJES; //si vale esto no se tendra en cuanta la reconversion
        } 

        //redirigimos a la funcion que convierta los mensajes a su version correspondiente
        switch(VERSION_ACTUAL_MENSAJES) {
            case 2:
                lMensajes = transformarMsgAVersion2(root,idUsuario,tipoDestinatario,reconvertir);
                break;
             //case 3:
                //lMensajes = transformarMsgAVersion3(lMensajes,root,idUsuario,tipoDestinatario,reconvertir);
                //break;
               //añadir mas versiones...etc
            default:
                log.debug("Error al transformar los mensajes a la versión " + VERSION_ACTUAL_MENSAJES);
        }
        
        return lMensajes;
    }
     *
     */

    /*
     *
    private List<Element> transformarMsgAVersion2(Element padre,int idUsuario,int tipoDestinatario,int reconvertir) {
        log.debug("\n\nConvirtiendo mensajes a la version 2"
                + "\n==================================");

        /*nuevo formato version 2 y posteriores
         * <mensajes>
         *      <version num="2"></version>
         *      <listaMensajes>
         *          mensajes....
         *      </listaMensajes>
         * </mensajes>
         */
    /*
        Document doc = new Document(); //nuevo documento
        Element root = new Element("mensajes");
        Element version = new Element("version");
        version.setAttribute("num", "2");
        root.addContent(version);
        Element lista = new Element("listaMensajes");
        root.addContent(lista);
        List<Element> lMensajes = null;
        
        if(reconvertir==0)
        {
            //si viene de la version 0 la lista esta en el root
            log.debug("Version 0: ");
            lMensajes = padre.getChildren();
        }else{
            //sino esta dentro del elemento listaMensajes
            log.debug("Version 2: ");
            lMensajes = padre.getChild("listaMensajes").getChildren();
        }

        log.debug("Elementos del padre: "+lMensajes.size());

        //recorremos la lista original de mensajes y la ponemos en la nueva
        for (Element el : lMensajes) {
            //añadir los nuevos atributos que tendría la versión 2 y se lo añadimos al root
            el.setAttribute("prueba", "Atributo ejemplo version 2");
            root.getChild("listaMensajes").addContent((Element)el.clone());
        }

        doc.setRootElement(root);

        //escribo el nuevo documento en el fichero del usuario
        volcarDocAFichero(doc, idUsuario, tipoDestinatario);

        log.debug("Exito al reconvertir los mensajes a la version 2");

        return root.getChild("listaMensajes").getChildren();
    }
     *
     */

    public List<MensajeUsuario> leerMensajesTorneo(int idTemporada) {

        List<MensajeUsuario> retorno = null;
        try {
            Document doc = obtenerXMLMensajesTorneo(idTemporada);

            if (doc != null) {
                Element root = doc.getRootElement();
                List<Element> l = root.getChildren();
                
                //creamos la lista de mensajes definitiva
                retorno = new ArrayList<MensajeUsuario>();
                for (Element el : l) {
                    MensajeUsuario elMensaje = new MensajeUsuario();

                    elMensaje.setId(Integer.parseInt(el.getAttributeValue("id")));
                    elMensaje.setTipoUsuarioEmisor(Integer.parseInt(el.getAttributeValue("te")));
                    elMensaje.setFrom(el.getAttributeValue("f"));
                    elMensaje.setFromUrl(el.getAttributeValue("fu"));
                    elMensaje.setSender(Integer.parseInt(el.getAttributeValue("s")));
                    //elMensaje.setTo(el.getAttributeValue("t"));
                    elMensaje.setFecha(el.getAttributeValue("d"));
                    elMensaje.setAsunto(el.getAttributeValue("a"));
                    elMensaje.setTexto(el.getAttributeValue("b"));
                    elMensaje.setSentido(Integer.parseInt(el.getAttributeValue("w")));

                    retorno.add(elMensaje);
                }
            }
        } catch (Exception e) {
            log.error("Error", e);
        }

        return retorno;
    }


    /*
     * Devuelve el objeto "Document" con todo el XML del usuario, para poder
     * añadir o borrar mensajes y posteriormente volcarlo a un fichero
     */
    protected Document obtenerXMLMensajesUsuario(int idUsuario) {

        Document retorno = null;

        try {
            SAXBuilder parser = new SAXBuilder();
            File f = new File(getFicheroMensajeUsuario(idUsuario));
            if (f.exists()) {
                if (f.length() > 0) {
                    retorno = parser.build(f);
                }
            }
        } catch (JDOMException  jde) {
        } catch (Exception e) {
            log.error("Error", e);
        }

        return retorno;

    }



    /*
     * Devuelve el objeto "Document" con todo el XML del usuario, para poder
     * añadir o borrar mensajes y posteriormente volcarlo a un fichero
     */
    protected Document obtenerXMLMensajesTorneo(int idTemporada) {

        Document retorno = null;

        try {
            SAXBuilder parser = new SAXBuilder();
            File f = new File(getFicheroMensajeTorneo(idTemporada));
            if (f.exists()) {
                if (f.length() > 0) {
                    retorno = parser.build(f);
                }
            }
        } catch (JDOMException  jde) {
        } catch (Exception e) {
            log.error("Error", e);
        }

        return retorno;

    }


    public Date getFechaActual() {
        return new Date();
    }

    /*
     * Devuelve el path del fichero de mensaje
     */
    public static String getFicheroMensajeUsuario(int idUsuario) {
        String retorno = pathMensajeriaUsuario;

        DecimalFormat f1 = new DecimalFormat("00");
        DecimalFormat f2 = new DecimalFormat("00000");

        int n1 = idUsuario/1000000;
        int n2 = (idUsuario-n1*1000000)/10000;
        int n3 = (idUsuario-n1*1000000-n2*10000);

        retorno += "/" + f1.format(n1);
        retorno += "/" + f1.format(n2);
        retorno += "/" + f2.format(n3) + ".xml";

        return retorno;
    }


    /*
     * Devuelve el path del fichero de mensaje
     */
    public String getFicheroMensajeTorneo(int idTemporada) {
        String retorno = pathMensajeriaTorneo;

        DecimalFormat f1 = new DecimalFormat("00");
        DecimalFormat f2 = new DecimalFormat("0000");

        int n1 = idTemporada/1000000;
        int n2 = (idTemporada-n1*1000000)/10000;
        int n3 = (idTemporada-n1*1000000-n2*10000);

        retorno += "/" + f1.format(n1);
        retorno += "/" + f1.format(n2);
        retorno += "/" + f2.format(n3) + ".xml";

        return retorno;
    }


    public final List<MensajeUsuario> getListaMensajes() {
        return listaMensajes;
    }

    public final void setListaMensajes(List<MensajeUsuario> listaMensajes) {
        this.listaMensajes = listaMensajes;
    }


    public Semanal getWeeklyBoard(int idEquipo) {
        EntityManager em = null;
        Semanal retorno = null;

        try {
            em = emfBasket.createEntityManager(); // checked
            Query q = em.createNamedQuery("Semanal.findByEquipoId");
            q.setParameter("equipoId", idEquipo);
            retorno = (Semanal)q.getSingleResult();
        } catch (NoResultException nre) {
        } catch (Exception e) {
            log.error("getWeeklyBoard", e);
        } finally {
            try { em.close(); } catch (Exception e) { }
        }

        return retorno;
    }

    // Mensajes
    public int escribirMensaje(MensajeUsuario mensaje) {

        log.debug("escribirMensaje");

        int retorno = 1;

        try {
            Document doc = null;

            switch (mensaje.getTipoDestinatario()) {
                case 0:
                    doc = obtenerXMLMensajesUsuario(mensaje.getReceiver());
                    break;
                case 1:
                    doc = obtenerXMLMensajesTorneo(mensaje.getReceiver());
                    break;
            }

            Element rootMensajes = null;

            /*nuevo formato version 2 y posteriores
             * <mensajes>
             *      <version num="2"></version>
             *      <listaMensajes>
             *          mensajes....
             *      </listaMensajes>
             * </mensajes>
             */
            if (doc != null) {
                rootMensajes = doc.getRootElement();
            } else {
                rootMensajes = new Element("mensajes");
                Element version = new Element("version");
                version.setAttribute("num", "2");
                rootMensajes.addContent(version);
                //Element lista = new Element("listaMensajes");
                //rootMensajes.addContent(lista);
                doc = new Document(rootMensajes);
            }

            Element elMensaje = new Element("mensaje");

            // Hay que poner como id del nuevo mensaje, el id del último almacenado + 1
            int ultimoId = 0;

            List<MensajeUsuario> listaMensajesDestinatario = null;
            
            switch (mensaje.getTipoDestinatario()) {
                case 0:
                    listaMensajesDestinatario = leerMensajesUsuario(mensaje.getReceiver());
                    break;
                case 1:
                    listaMensajesDestinatario = leerMensajesTorneo(mensaje.getReceiver());
                    break;
            }

            if (listaMensajesDestinatario != null && listaMensajesDestinatario.size()>0) {
                //ultimoId = listaMensajesDestinatario.get(listaMensajesDestinatario.size()-1).getId();
                // Como ahora se lee hacia atrás, hay que coger el primero
                ultimoId = listaMensajesDestinatario.get(0).getId();
            }

            elMensaje.setAttribute("id", Integer.toString(ultimoId+1));
            //elMensaje.setAttribute("v", VERSION_ACTUAL_MENSAJES);
            elMensaje.setAttribute("te", Integer.toString(mensaje.getTipoUsuarioEmisor()));
            elMensaje.setAttribute("f", mensaje.getFrom());
            elMensaje.setAttribute("fu", mensaje.getFromUrl());
            elMensaje.setAttribute("s", Integer.toString(mensaje.getSender()));
            //elMensaje.setAttribute("t", mensaje.getTo());

            DateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
            elMensaje.setAttribute("d", df.format(new java.util.Date())); // Fecha actual

            if (mensaje.getTipoUsuarioEmisor() == MensajeUsuario.TIPO_USUARIO_NORMAL) {
                // Los usuarios normales no pueden enviar código HTML
                elMensaje.setAttribute("a", escapeHtml(mensaje.getAsunto()));
                elMensaje.setAttribute("b", escapeHtml(mensaje.getTexto()));
            } else {
                elMensaje.setAttribute("a", mensaje.getAsunto());
                elMensaje.setAttribute("b", mensaje.getTexto());
            }

            elMensaje.setAttribute("w", Integer.toString(mensaje.RECIBIDO));

            switch (mensaje.getTipoDestinatario()) {
                case 0:
                    //rootMensajes.getChild("listaMensajes").addContent(elMensaje);
                    rootMensajes.addContent(elMensaje);
                    break;
                case 1:
                    //rootMensajes.getChild("listaMensajes").addContent(0, elMensaje);
                    rootMensajes.addContent(0, elMensaje);
                    break;
            }

            volcarDocAFichero(doc, mensaje.getReceiver(), mensaje.getTipoDestinatario());

            retorno = 0;
        } catch (Exception e) {
            log.error("Error", e);
            retorno = -1;
        }

        return retorno;
    }

    protected void volcarDocAFichero(Document doc, int idUsuario, int tipoDestinatario) {
        try {
            File f = null;
            switch (tipoDestinatario) {
                case 0:
                    f = new File(getFicheroMensajeUsuario(idUsuario));
                    break;
                case 1:
                    f = new File(getFicheroMensajeTorneo(idUsuario));
                    break;
            }
            FileOutputStream fout = new FileOutputStream(f);

            XMLOutputter out = new XMLOutputter();
            out.output(doc, fout);
        } catch (Exception e) {
            log.error("volcarFichero", e);
        }

    }

    public Ropa getRopaById(int idRopa) {
        EntityManager em = null;
        Ropa retorno = null;

        //log.debug("getRopaById(" + idRopa + ")");
        try {
            em = emfBasket.createEntityManager(); // checked
            retorno = em.find(Ropa.class, idRopa);
            //log.debug("retorno: " + retorno);
        } catch (Exception e) {
            log.error("Error en getRopaById: ", e);
        } finally {
            try { em.close(); } catch (Exception e) { };
        }

        return retorno;

    }

    public String formateaFechaLinksPartidos(Date fecha) {
        DateFormat df = new SimpleDateFormat("yyyyMMdd");
        String retorno = df.format(fecha);

        return retorno;
    }

    public int getNumMensajesBandejaEntrada() {
        return numMensajesBandejaEntrada;
    }

    public final void setNumMensajesBandejaEntrada(int numMensajesBandejaEntrada) {
        this.numMensajesBandejaEntrada = numMensajesBandejaEntrada;
    }

    public String getTextoLocalizado(String filename, String key) {

        String retorno = "";

        log.debug(">>> Leyendo texto " + key + " de " + filename);

        try {
            Properties textos = new Properties();

            if (session.get("bd_lang")!=null) {
                String lang = (String)session.get("bd_lang");

                filename = "/resources/" + filename + "_" + lang + ".xml";
                InputStream is = getClass().getResourceAsStream(filename);
                textos.loadFromXML(is);

                retorno = textos.getProperty(key);
            }
        } catch (Exception e) {
            log.error("[getTextoLocalizado] Error al cargar texto (filename=" + filename + ", key = " + key +")", e);
        }

        return retorno;

    }

    public String escapeHtml(String cadena) {
        /*
         * http://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet
         * & --> &amp;
         * < --> &lt;
         * > --> &gt;
         * " --> &quot;
         * ' --> &#x27;     &apos; is not recommended
         * / --> &#x2F;     forward slash is included as it helps end an HTML entity
         */

        String retorno = cadena;
        retorno = retorno.replace("&", "&amp;");
        retorno = retorno.replace("<", "&lt;");
        retorno = retorno.replace(">", "&gt;");
        retorno = retorno.replace("\"", "&quot;");
        retorno = retorno.replace("'", "&#x27;");
        retorno = retorno.replace("/", "&#x2F;");

        return retorno;
    }

    public String getLower(String cadena) {
        return cadena.toLowerCase();
    }

    public String[] getMensaje() {
        return mensaje;
    }

    public void setMensaje(String[] mensaje) {
        this.mensaje = mensaje;
    }

    public String getAsunto() {
        return asunto;
    }

    public void setAsunto(String asunto) {
        this.asunto = asunto;
    }

    public List<Equipo> getListaEquiposMostrar() {
        return listaEquiposMostrar;
    }

    public final void setListaEquiposMostrar(List<Equipo> listaEquiposMostrar) {
        this.listaEquiposMostrar = listaEquiposMostrar;
    }

    /*
    public static void main(String[] args) {
        String texto = "el 22/09/2011";
        System.out.println(texto);
        System.out.println(escapeHtml(texto));
    }
     *
     */
}
